package com.twb.core.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

@SuppressWarnings("all")
public class JsonUtil {
	
	/**
	 * @Title parseJSON2List
	 * @Class JsonUtil.java
	 * @Description Json字符串转List<Map<String, Object>>
	 
	 * @param jsonStr
	 * @return
	 
	 * @author DHL
	 * @date 2015年9月24日 上午9:25:23
	 */
	public static List<Map<String, Object>> parseJSON2List(String jsonStr){
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		list = JSON.parseObject(jsonStr, list.getClass());
        return list;  
    }  
     
    /**
     * @Title parseJSON2Map
     * @Class JsonUtil.java
     * @Description Json字符串转Map<String, Object>
     
     * @param jsonStr
     * @return
     
     * @author DHL
     * @date 2015年9月24日 上午9:25:51
     */
    public static Map<String, Object> parseJSON2Map(String jsonStr){  
        Map<String, Object> map = new HashMap<String, Object>();  
        map = JSON.parseObject(jsonStr, map.getClass());
        return map;  
    }  
      
    /**
	 * @Title writeJsonByFilter
	 * @Class BaseController.java
	 * @Description 将对象转换成JSON字符串，并响应回前台
	 
	 *@param object
	 *@param includesProperties	需要转换的属性
	 *@param excludesProperties 不需要转换的属性
	 
	 * @author DHL
	 * @date 2014年4月18日 上午8:30:05
	 */
	public static String getJsonByFilter(Object object, String[] includesProperties, String[] excludesProperties) {
		FastjsonFilter filter = new FastjsonFilter();// excludes优先于includes
		if (excludesProperties != null && excludesProperties.length > 0) {
			filter.getExcludes().addAll(Arrays.<String> asList(excludesProperties));
		}
		if (includesProperties != null && includesProperties.length > 0) {
			filter.getIncludes().addAll(Arrays.<String> asList(includesProperties));
		}
		String json;
		
		// 使用SerializerFeature.WriteDateUseDateFormat特性来序列化日期格式的类型为yyyy-MM-dd hh24:mi:ss
		// 使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成
		json = JSON.toJSONString(object, filter, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect);
		
		return json;
	}
	
	
	/**
	 * @Title writeJson
	 * @Class BaseController.java
	 * @Description 将对象转换成JSON字符串，并响应回前台
	 
	 *@param object
	 
	 * @author DHL
	 * @date 2014年4月18日 上午8:33:29
	 */
	public static String getJson(Object object) {
		return getJsonByFilter(object, null, null);
	}
	
	/**
	 * @Title writeJsonByIncludesProperties
	 * @Class BaseController.java
	 * @Description 将对象转换成JSON字符串，并响应回前台
	 
	 *@param object
	 *@param includesProperties 需要转换的属性
	 
	 * @author DHL
	 * @date 2014年4月18日 上午8:33:57
	 */
	public static String getJsonByIncludesProperties(Object object, String[] includesProperties) {
		return getJsonByFilter(object, includesProperties, null);
	}
	
	/**
	 * @Title writeJsonByExcludesProperties
	 * @Class BaseController.java
	 * @Description 将对象转换成JSON字符串，并响应回前台
	 
	 *@param object
	 *@param excludesProperties 不需要转换的属性
	 
	 * @author DHL
	 * @date 2014年4月18日 上午8:34:30
	 */
	public static String getJsonByExcludesProperties(Object object, String[] excludesProperties) {
		return getJsonByFilter(object, null, excludesProperties);
	}
   
	public static void main(String[] args) {
		Map<String, Object> map = new HashMap<String, Object>();
		Map<String, Object> map1 = new HashMap<String, Object>();
		map1.put("map1", 1);
		map.put("map", "map");
		map.put("map1", map1);
		
		String jsonString = JSON.toJSONString(map);
		System.out.println(jsonString);
		
		Map<String, Object> parseJSON2Map = parseJSON2Map(jsonString);
		System.out.println();
	}
}
